package net.yc.imalachat.push.frags.user;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.ImageFormat;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

import androidx.annotation.Nullable;

import com.bumptech.glide.Glide;
import com.example.common.app.Application;
import com.example.common.app.PresenterFragment;
import com.example.common.widget.PortraitView;
import com.example.factory.Factory;
import com.example.factory.net.UploadHelper;
import com.example.factory.presenter.user.UpdateInfoContract;
import com.example.factory.presenter.user.UpdateInfoPresenter;
import com.yalantis.ucrop.UCrop;

import net.qiujuer.genius.ui.widget.Loading;
import net.yc.imalachat.push.R;
import net.yc.imalachat.push.activities.MainActivity;
import net.yc.imalachat.push.media.GalleryFragment;

import java.io.File;

import butterknife.BindView;
import butterknife.OnClick;

import static android.app.Activity.RESULT_OK;

/**
 * 更新信息的界面
 */
public class UpdateInfoFragment extends PresenterFragment<UpdateInfoContract.Presenter>
        implements UpdateInfoContract.View{
    private static final String TAG = "UpdateInfoFragment";
    @BindView(R.id.im_sex)
    ImageView mSex;

    @BindView(R.id.edit_desc)
    EditText mDesc;

    @BindView(R.id.loading)
    Loading mLoading;

    @BindView(R.id.btn_submit)
    Button mSubmit;
    // 本地头像地址
    private String mPortraitFilePath;

    private boolean isMan = true;

    @BindView(R.id.im_portrait)
    PortraitView mPortrait;

    public UpdateInfoFragment() {
    }

    @Override
    protected int getContentLayoutId() {
        return R.layout.fragment_update_info;
    }

    @OnClick(R.id.im_portrait)
    void onPortraitClick() {
        new GalleryFragment()
                .setListener(new GalleryFragment.OnSelectedListener() {
                    @Override
                    public void onSelectedImage(String path) {
                        UCrop.Options option = new UCrop.Options();
                        // 设置图片处理的格式JPEG
                        option.setCompressionFormat(Bitmap.CompressFormat.JPEG);
                        // 设置图片压缩之后的精度
                        option.setCompressionQuality(96);

                        // 图片缓存的地址
                        File dPath = Application.getPortraitTmpFile();

                        // 发起剪切
                        UCrop.of(Uri.fromFile(new File(path)), Uri.fromFile(dPath))
                            .withAspectRatio(1, 1)  // 1:1 比例
                            .withMaxResultSize(520, 520)    // 返回最大的尺寸
                            .withOptions(option)     // 相关参数
                            .start(getActivity());  // 这个activity的回调是回调到了下面的那个onActivityResult()
                    }
                }) // show 的时候建议使用getChildFragmentManager
                    // tag GalleryFragment class 名
                .show(getChildFragmentManager(), GalleryFragment.class.getName());
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
        // 收到从Activity传递过来的回调，然后取出其中的值进行图片的加载
        // 如果是我能处理的类型
        if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
            final Uri resultUri = UCrop.getOutput(data);
            if (resultUri != null) {
                // 渲染到界面
                loadPortraitImage(resultUri);
            }
        } else if (resultCode == UCrop.RESULT_ERROR) {
            Application.showToast(R.string.data_rsp_error_unknown);
            final Throwable cropError = UCrop.getError(data);
        }
    }

    /**
     * 加载图片到头像中
     * @param uri
     */
    private void loadPortraitImage(Uri uri) {
        mPortraitFilePath = uri.getPath();
        Glide.with(this)
                .load(uri)
                .asBitmap()
                .centerCrop()
                .into(mPortrait);

        // 拿到本地文件的地址
        final String localPath = uri.getPath();
        Log.e(TAG, "loadPortraitImageLocalPath: " + localPath);

        Factory.runOnAsync(new Runnable() {
            @Override
            public void run() {
                // localPath：这是在主线程中的变量，要放在子线程中执行的话，需要改成final，才可以跨方法使用
                String url = UploadHelper.uploadPortrait(localPath);
                Log.i(TAG, "run: " + url);
            }
        });
    }

    @OnClick(R.id.im_sex)
    void onSexClick() {
        // 性别图片点击的时候触发
        // 更换性别
        isMan = !isMan;

        Drawable drawable = getResources().getDrawable(isMan ?
                R.drawable.ic_sex_man : R.drawable.ic_sex_woman);
        mSex.setImageDrawable(drawable);
        // 设置背景层级，切换颜色
        mSex.getBackground().setLevel(isMan ? 0 : 1);

    }

    @Override
    public void showError(int str) {
        super.showError(str);
        // 显示错误的时候触发
        // 停止loading
        mLoading.stop();
        // 让控件可以输入
        mDesc.setEnabled(true);
        mSex.setEnabled(true);
        // 让提交按钮可以继续操作
        mSubmit.setEnabled(true);
    }

    @Override
    public void showLoading() {
        super.showLoading();
        mLoading.start();
        mDesc.setEnabled(false);
        mSex.setEnabled(false);
        mSubmit.setEnabled(false);
    }

    @OnClick(R.id.btn_submit)
    void onSubmitClick() {
        String desc = mDesc.getText().toString();
        // 调用P层进行更新
        mPresenter.update(mPortraitFilePath, desc, isMan);
    }

    @Override
    protected UpdateInfoContract.Presenter initPresenter() {
        // 初始化
        return new UpdateInfoPresenter(this);
    }

    @Override
    public void updateSucceed() {
        // 更新成功
        MainActivity.show(getContext());
        getActivity().finish();

    }
}